package thread;
//高频面试题!!!
class SingletonLazy {
    //这个引用指向当前的唯一实例,这个引用先初始化为空,而不是立即创建实例
    private static Object locker = new Object();
    private volatile static SingletonLazy instance = null;//使用volatile杜绝指令重排序
    public static SingletonLazy getInstance(){
        //如果instance为空,说明是首次加载,此时就需要考虑线程安全问题,就要加锁
        //如果是非null,就说明已经加载过了,就说明后续的调用,不必再加锁了
        if (instance==null){//是否要加锁
            synchronized (locker){//双重校验锁
                if(instance==null){//判定是否要创建对象;如果不加锁线程不安全,多线程环境下,可能会创建多个实例
                    instance = new SingletonLazy();
                }
            }
        }
        return instance;
    }
    private SingletonLazy(){}

}

public class ThreadDemo2 {
    public static void main(String[] args) {
        SingletonLazy s1 = SingletonLazy.getInstance();
        SingletonLazy s2 = SingletonLazy.getInstance();
        System.out.println(s1 == s2);
    }
}
